<?php
	abstract class TableSpecifique extends Table {
		private $_nomTable_;
		private $_clePrimaire_;
		private $_valeur_;
		
		public $identifiant;
		public $valeur;
		
		public function __construct($valeur, $_nomTable_, $_clePrimaire_, $_valeur_) {
			parent::__construct();
			
			$this->identifiant 		= -1;
			$this->valeur 			= $valeur;
			
			$this->_nomTable_ 		= $_nomTable_;	
			$this->_clePrimaire_ 	= $_clePrimaire_;
			$this->_valeur_ 		= $_valeur_;
		}
		
		public function __toString() {
			if (empty($this->valeur)) {
				try {
					$this->completer();
				}
				catch (TableSpecifiqueException $e) {}
			}
			
			return $this->valeur;
		}
		
		public function ajouter() {
			$st = $this->db->prepare("INSERT INTO ".$this->_nomTable_." VALUES(NULL, ?)");
			$st->execute(array($this->valeur));
			
			$this->identifiant = $this->db->lastInsertId();
		}
		
		public function modifier() {
			$st = $this->db->prepare("UPDATE ".$this->_nomTable_." SET ".$this->_valeur_."=? WHERE ".$this->_clePrimaire_."=?");
			$st->execute(array($this->valeur, $this->identifiant));
		}
		
		public function enregistrer() {	
			if ($this->identifiant == -1) {
				$this->ajouter();
			}
			else {
				$this->modifier();
			}
		}
		
		public function completer() {
			if ($this->identifiant != -1) {
				$sql = "SELECT * FROM ".$this->_nomTable_." WHERE ".$this->_clePrimaire_."=?";
				
				$st = $this->db->prepare($sql);
				$st->execute(array($this->identifiant));
				
				$result = $st->fetch();
				
				if (is_array($result)) {
					$this->identifiant = $result[$this->_clePrimaire_];
					$this->valeur = $result[$this->_valeur_];
				}
				else {
					throw new TableSpecifiqueException($this->identifiant, $this->valeur);
				}
			}
			else {
				throw new TableSpecifiqueInvalideException($this->identifiant, $this->valeur);
			}
		}
		
		public function supprimer() {
			if ($this->identifiant != -1) {
				$sql = "DELETE FROM ".$this->_nomTable_." WHERE ".$this->_clePrimaire_."=?";
				
				$st = $this->db->prepare($sql);
				$st->execute(array($this->identifiant));
			}
			else {
			}
		}
		
		static public function recupererAvecID($identifiant, $_nomClass_) {
			if ($identifiant > 0) {
				$tmp = new $_nomClass_();
				$tmp->identifiant = $identifiant;
				$tmp->completer();
				
				return $tmp;
			}
			else {
				throw new TableSpecifiqueInvalideException($identifiant, null);
			}
		}
		
		static public function recupererListe($_nomClass_) {
			$liste = array();
			
			$st = DB::get_instance()->prepare("SELECT * FROM ".$_nomClass_);
			$st->execute();
			
			foreach ($st->fetchAll(PDO::FETCH_ASSOC) as $element) {
				$objet = new $_nomClass_($element[lcfirst($_nomClass_)]);
				$objet->identifiant = $element['no'.$_nomClass_];
				
				$liste[] = $objet;
			}
			
			return $liste;
		}
	}
	
	class TableSpecifiqueException extends MyException {
		public function __construct($identifiant, $valeur) {
		}
	}
	
	class TableSpecifiqueInvalideException extends TableSpecifiqueException {
		public function __construct($identifiant, $valeur) {
		}
	}
?>